package logic

import (
	"fmt"
	"gvb-server/Request"
	"gvb-server/global"
	"gvb-server/models"
	"gvb-server/utils"
	"io"
	"mime/multipart"
	"path"
	"strconv"
	"strings"
	"time"

	"github.com/gin-gonic/gin"
)

func GetBanners(s Request.BannerRequest) (utils.RList[models.Banner], error) {
	var b []models.Banner
	var rb utils.RList[models.Banner]

	w := map[string]any{
		"status": 1,
	}

	query := global.DB.Table("banners") // 如果不用表结构体 就必须写表名
	// 获取总数
	err = query.Where(w).Count(&utils.TotalRows).Error
	if err != nil {
		return rb, err
	}

	if utils.TotalRows%int64(s.Size) == 0 {
		utils.TotalPages = utils.TotalRows / int64(s.Size)
	} else {
		utils.TotalPages = (utils.TotalRows / int64(s.Size)) + 1
	}

	offset := (s.Page - 1) * s.Size

	// 排序
	sort := "create_date asc"
	if s.Sort == "" {
		sort = "create_date desc"
	}

	err = query.Limit(s.Size).Offset(offset).Order(sort).Where(w).Find(&b).Error

	rb.List = b
	rb.Page = s.Page
	rb.Size = s.Size
	rb.TotalPages = totalPages
	return rb, err
}

func DelBanners(s Request.BannerDelRequest) utils.PubStatus {
	var rb utils.PubStatus
	var bm models.Banner
	r := bm.DelByIds(s)
	rb.Status = utils.SUCCESS

	if r.Status == utils.ERROR {
		rb.Status = r.Status
		rb.Msg = r.Msg
	}
	rb = r
	return rb
}

// UpdateBanner 修改文件
func UpdateBanner(s Request.BannerEditRequest, id string) utils.PubStatus {
	var rb utils.PubStatus
	var bm models.Banner
	r := bm.UpdateByIds(s, id)
	rb.Status = utils.SUCCESS

	if r.Status == utils.ERROR {
		rb.Status = r.Status
		rb.Msg = r.Msg
	}

	rb = r
	return rb
}

var ImagesSuffix = map[string]bool{
	".jpg":  true,
	".jpeg": true,
	".png":  true,
	".gif":  true,
}

// Upload 修改文件
func Upload(file *multipart.FileHeader, c *gin.Context, fileBash string, filePath string, t int) (res utils.UploadRes) {
	header := file.Header
	size := float64(file.Size) / float64(1024*1024)
	name := file.Filename
	res.FileName = name
	res.Code = utils.ERROR

	extName := path.Ext(file.Filename)

	if _, ok := ImagesSuffix[extName]; !ok {
		res.Msg = fmt.Sprintf(utils.MessageString[utils.UploadNotSupportExt])
		return
	}

	// md5文件，判断是否重复上传[同样的文件 不同的名称也是一样的]
	fileObj, err := file.Open()
	if err != nil {
		global.Log.Error(fmt.Printf("文件打开失败:%v\n", err))
		return
	}

	filep := path.Join(fileBash, file.Filename)
	byteData, err := io.ReadAll(fileObj)

	md5String := utils.MD5(byteData)
	fmt.Println("文件hash值：", md5String)

	// 保存
	typeImg := models.ImageTypeLocal
	// 判断是否上传第三方仓库 1、七牛
	if global.Config.QiNiu.Enable {
		typeImg = models.ImageTypeQiNiu
		filep, err = utils.UploadQiNiu(byteData, "gvb", name)
		if err != nil {
			res.Code = utils.ERROR
			res.Msg = err.Error()
			return
		}
		res.FileName = filep
		res.Code = utils.SUCCESS
		res.Msg = "上传七牛成功！"
	} else {
		// 判断大小
		fmt.Printf("文件header：%s, 大小：%.2f M，文件名称：%s\n", header, size, name)
		if size > float64(global.Config.Upload.Size) {
			res.Msg = fmt.Sprintf(utils.MessageString[utils.UploadSaveErrorSize]+"设定值的大小为：%d", strconv.FormatInt(global.Config.Upload.Size, 10)+"MB")
			return
			//uploadRs[k].FileName = name
			//uploadRs[k].Code = utils.ERROR
			//uploadRs[k].Msg = utils.MessageString[utils.UploadSaveErrorSize]
		}

		// 去数据库中查看 这个图片的hash是否存在
		var banner models.Banner
		err = global.DB.Take(&banner, "hash = ? ", md5String).Error
		if err == nil {
			// 找到了
			res.FileName = filePath + "/" + name
			res.Code = utils.SUCCESS
			res.Msg = fmt.Sprintf(utils.MessageString[utils.UploadSChecked])
			return
		}
	}

	// 保存本地
	err = c.SaveUploadedFile(file, filep)
	if err != nil {
		res.FileName = filep + name
		res.Code = utils.ERROR
		res.Msg = utils.MessageString[utils.UploadSaveErrorSize]
		return
	}

	// 写表 并获取id
	if t == 2 {

		// 获取文件名（去掉扩展名）
		nameWithoutExt := strings.TrimSuffix(name, extName)

		// 截取前6位
		if len(nameWithoutExt) > 6 {
			nameWithoutExt = nameWithoutExt[:6]
		}

		// 组合新的文件名
		newFilename := nameWithoutExt + extName
		var bn = models.Users{
			CreateDate: time.Now().Unix(),
			Avatar:     filep,
			UserName:   newFilename,
			NickName:   newFilename,
			Password:   "$2a$04$9aucV9.KidlaSN/LRaOzoePjIZkjTPpao5IRC4SaLu9cXI7IylF3a",
		}

		// 写表
		global.DB.Create(&bn)
		res.Rid = bn.ID

	} else {
		var bn = models.Banner{
			CreateDate: time.Now().Unix(),
			Path:       filep,
			Hash:       md5String,
			Name:       name,
			Type:       typeImg,
		}

		// 写表
		global.DB.Create(&bn)
		res.Rid = bn.ID
	}

	//返回
	res.FileName = filep
	res.Code = utils.SUCCESS
	res.Msg = utils.MessageString[utils.UploadSaveOK]
	return
}
